變數提供了一個有名稱的記憶體位址
當我們宣告 int x = 0
的時候
其實是系統在記憶體當中找一塊 int 大小的空間
記錄下記憶體位址(像是 0x23ff12,每次不一樣)
名稱設為 x
當我們要知道變數的位址的時候
可以使用&來取得
int main(void) {
    int x = 10;
    printf("Value of x : %d\n", x);
    printf("Address of x : %p\n", &x);
    return 0;
}
/**
output:
Value of x : 10
Address of x : 0x23ff12
**/
type *param
Example:
int *num;
float *num2;
char *str01;
指標也必須宣告 目標 的變數型態
#include <stdio.h>
int main()
{
  int num = 10;
  int *prt = #
  printf("The value of address where ptr point : %p\n", prt);
  printf("num The value of num: %d", *prt);
  return 0;
}
上述範例中第二次printf中 *prt 會顯示出指標所指的值
而不是位址
* 稱為提取運算子
#include <stdio.h>
int main()
{
  int x = 10;
  int *ptr = &x;
  printf("The value is %d\n", *ptr);
  *ptr = 20;
  printf("The value is %d\n", *ptr);
  printf("x: %d\n", x);
  return 0;
}
/**
The value is 10
The value is 20
x : 20
**/
也就是代表若是修改指標的值
同時也會修改原本的值
之前曾經說過在Function 中修改值
並不會影響傳入的值
#include <stdio.h>
void swap(int x, int y)
{
  int tmp;
  tmp = x;
  x = y;
  y = tmp;
}
int main()
{
  int x = 5, y = 10;
  printf("Before : x = %d, y = %d\n", x, y);
  swap(x, y);
  printf("After : x = %d, y = %d", x, y);
  return 0;
}
/**
Before : x=5, y=10
After : x = 5, y = 10
**/
但是若我們傳入的是指標
#include <stdio.h>
void swap(int *x, int *y)
{
  int tmp;
  tmp = *x;
  *x = *y;
  *y = tmp;
}
int main()
{
  int x = 5, y = 10;
  printf("Before : x = %d, y = %d\n", x, y);
  //傳記憶體位址進去
  swap(&x, &y);
  printf("After : x = %d, y = %d\n", x, y);
  return 0;
}
/**
Before : x=5, y=10
After : x = 10, y = 5
**/